package com.javastudy.liuhouse.lambda.stream;

import org.junit.Test;

import java.net.URL;
import java.nio.file.*;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.LongStream;
import java.util.stream.Stream;

/*
创建Stream的方法有
1.通过指定元素,指定数组,指定Collection创建Stream
2.通过Supplier创建Stream可以是无限序列
3.通过其他类的相关方法创建

基本类型的Stream有  IntStream LongStream 和 DoubleStream
* */

//测试创建Stream的方法
public class StreamCreate {
    //第一种创建Stream的方法  Stream.of()
    @Test
    public void createStream1(){
        Stream<String> stream = Stream.of("A", "B", "C", "D");
        //Foreach()方法相当于内部循环调用
        //可传入符合Consumer接口的void accept(T t)的方法引用
        stream.forEach(System.out::println);
    }

    //基于数组或Collection
    //这里不能换成java9,为什么呢,因为线上使用的是java8,本地换成java9的话,线上会出问题
    //所以要以线上为主，而家里学习就用java21，问题不大
    @Test
    public void createStream2(){
        //基于数组创建Stream
        Stream<String> stream1 = Arrays.stream(new String[]{"A" , "B" , "C"});
        stream1.forEach(System.out::println);
        //基于列表创建Stream
        //List.of() 是 java9才引入的
        ArrayList<String> strings = new ArrayList<>();
        strings.add("A");
        strings.add("B");
        strings.add("C");
        System.out.println(strings);
        Stream<String> stream2 = strings.stream();
        stream2.forEach(System.out::println);
    }

    //基于Supplier创建Stream
    @Test
    public void createStream3(){
        Stream<Integer> generate = Stream.generate(new NatualSupplier());
        //注意：无限序列必须变成有限序列再打印
        generate.limit(20).forEach(System.out::println);
    }


    //使用Stream读取文件的内容
    @Test
    public void createStream4(){
       //文件名
        String fileName = "file.txt";
        try{
            //获取资源的URL
            URL resource_url = this.getClass().getClassLoader().getResource(fileName);
            //获取资源的URI，并转化为Path
            if(resource_url == null){
                System.out.println("文件未找到:" + fileName);
            }
            //转化为Path
            Path path = Paths.get(resource_url.toURI());
            //使用Files.lines读取文件
            try(Stream<String> lines = Files.lines(path)){
                lines.forEach(System.out::println);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


 //正则表达式的Pattern 对象有一个 splitAsStream()方法，可以直接把一个长字符串分割成Stream序列而不是数组
@Test
 public void createStream5(){
    Pattern p = Pattern.compile("\\s+");
    Stream<String> s = p.splitAsStream("The quick brown fox jumps over the lazy dog");
    s.forEach(System.out::println);
}


@Test
public void createStream6(){
     //将int[]数组变为IntStream
//    IntStream stream = Arrays.stream(new int[]{1, 2, 3});

    //假设有一恶搞字符串列表
    List<String> list = Arrays.asList("123", "456", "789");
    //将字符串转化为LongStream
    LongStream longStream = list.stream().mapToLong(Long::parseLong);
    //打印LongStream中的元素
    longStream.forEach(System.out::println);

}




@Test
public void createStream7(){
        //生成斐波那契数列的 LongStream
    LongStream fib = LongStream.generate(new FibSupplier());
    //打印Fibonacci数列:1, 1 , 2 , 3 , 5 , 8 , 13 , 21 ...
    fib.limit(10).forEach(System.out::println);
}


}
